﻿//"The contents of this file are subject to the Mozilla Public License
//Version 1.1 (the "License"); you may not use this file except in
//compliance with the License. You may obtain a copy of the License at
//http://www.mozilla.org/MPL/

//Software distributed under the License is distributed on an "AS IS"
//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//License for the specific language governing rights and limitations
//under the License.

//The Original Code is TSharp.

//The Initial Developer of the Original Code is Mar3ek (http://mar3ek.wordpress.com).
//Portions created by Mar3ek are Copyright (C) 2010
//Mar3ek (http://mar3ek.wordpress.com). All Rights Reserved.

//Contributor(s): ______________________________________.

//Alternatively, the contents of this file may be used under the terms
//of the _____ license (the  "[___] License"), in which case the
//provisions of [______] License are applicable instead of those
//above.  If you wish to allow use of your version of this file only
//under the terms of the [____] License and not to allow others to use
//your version of this file under the MPL, indicate your decision by
//deleting  the provisions above and replace  them with the notice and
//other provisions required by the [___] License.  If you do not delete
//the provisions above, a recipient may use your version of this file
//under either the MPL or the [___] License."

using System;
using System.Runtime.Serialization;
using System.Security.Permissions;

namespace TSharp
{
    ///<summary>
    /// Class representing a general exception encountered while communicating with Twitter servers
    ///</summary>
    [Serializable]
    public class TwitterException : Exception
    {
        private readonly string _message = string.Empty;
        private readonly string _request = string.Empty;
        private readonly Exception _inner;

        ///<summary>
        /// Creates a new instance of the TwitterException class
        ///</summary>
        ///<param name="message">Message describing the exception</param>
        ///<param name="request">Address of the API endpoint that raised the exception</param>
        public TwitterException(string message, string request)
        {
            _message = message;
            _request = request;
        }

        ///<summary>
        /// Creates a new instance of the TwitterException class
        ///</summary>
        ///<param name="message">Message describing the exception</param>
        public TwitterException(string message)
        {
            _message = message;
        }

        /// <summary>
        /// Message describing the error
        /// </summary>
        public override string Message
        {
            get { return _message; }
        }

        ///<summary>
        /// Inner exception
        ///</summary>
        public new Exception InnerException
        {
            get { return _inner; }
        }

        ///<summary>
        /// Address of the API endpoint that raised the exception
        ///</summary>
        public string Request
        {
            get { return _request; }
        }

        ///<summary>
        /// Creates a new instance of the TwitterException class
        ///</summary>
        public TwitterException()
        { }

        /// <exception cref="ArgumentNullException"><paramref name="info" /> is <c>null</c>.</exception>
        protected TwitterException(SerializationInfo info, StreamingContext context)
        {
            if (info == null) throw new ArgumentNullException("info");
            _message = (string) info.GetValue("message", typeof (string));
            _request = (string) info.GetValue("request", typeof (string));
            base.GetObjectData(info, context);
        }

        ///<summary>
        /// Creates a new instance of the TwitterException class
        ///</summary>
        ///<param name="message">Message describing the exception</param>
        ///<param name="innerException">Inner exception</param>
        public TwitterException(string message, Exception innerException)
        {
            _inner = innerException;
            _message = message;
        }

        /// <exception cref="ArgumentNullException"><paramref name="info" /> is <c>null</c>.</exception>
        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            if (info == null) throw new ArgumentNullException("info");
            info.AddValue("message", _message);
            info.AddValue("request", _request);
            base.GetObjectData(info, context);
        }
    }
}